const mysql = require('mysql')

// 创建数据库
const db = mysql.createPool({
  host: '127.0.0.1',
  password: 'mysql',
  user: 'root',
  database: 'graduation_design'
})

const execTransAction = (sqlArr) => {
  return new Promise((resolve, reject) => {
    var promiseArr = []
    db.getConnection(function (err, connection) {
      if (err) {
        return reject(err)
      }
      connection.beginTransaction((err) => {
        if (err) {
          return reject('开启事务失败')
        }
        // 将所有需要执行的sql封装为数组
        promiseArr = sqlArr.map(({ sql, values }, index) => {
          return new Promise((resolve, reject) => {
            connection.query(sql, values, (e, rows) => {
              if (e) {
                reject(e)
              }
              // 如果是插入或者删除语句对数据影响的行数为0也是删除失败!
              const sqlType = /^insert|^update/.test(sql)
              if (rows && rows.affectedRows === 0 && sqlType) {
                console.log(sql, values)
                reject('操作执行失败!')
              } else {
                resolve({ rows, success: true })
              }
            })
          })
        })

        // Promise调用所有sql，一旦出错，回滚，否则，提交事务并释放链接
        Promise.all(promiseArr)
          .then((res) => {
            connection.commit((error) => {
              if (error) {
                reject(error)
              }
              // 在事务提交完成之后再响应处理结果
              connection.release() // 释放链接
              resolve(res)
            })
          })
          .catch((err) => {
            connection.rollback(() => {
              console.log('数据操作回滚')
            })
            reject(err)
          })
      })
    })
  })
}

// 将数据库对象暴露出去
module.exports = { db, execTransAction }
